package views;

import javax.swing.*;

import common.Contexto;
import controllers.IErrorObserver;
import controllers.ReservasController;
import business.interfaces.ICalendarioReserva;
import data.entities.CalendarioReserva;
import data.entities.Cliente;
import data.entities.Socio;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * Panel que contiene la tabla de ubicaciones y permite seleccionar una entre las listadas.
 * 
 */
@SuppressWarnings("serial")
public class UbicacionesTablePanel extends JPanel  implements IErrorObserver {
    private JTable table;
    private JButton selectB, cancelB;
    private Action selectA, cancelA;
    private JPanel buttons;
    private List<ICalendarioReserva> ubicaciones;
    private UbicacionesTableModel tableModel;
    private ReservasController controller;
    private String dni;

    public UbicacionesTablePanel(List<ICalendarioReserva> ubicaciones, String dni) {
    	this.dni = dni;
    	this.ubicaciones = ubicaciones;
    	controller = new ReservasController();
    	this.controller.agregarErrorObserver(this);
        init();
    }

    private void init() {
    	this.setLayout(new BorderLayout());
    	initActions();
    	createTable();	

        buttons = new JPanel();
        selectB = new JButton(selectA);
        cancelB = new JButton(cancelA);
        
        
        buttons.add(selectB);
        buttons.add(cancelB);;
        add(buttons, BorderLayout.SOUTH);
    }

    public void createTable() {
        tableModel = new UbicacionesTableModel(ubicaciones);
        table = new JTable(tableModel);

        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);
    }
    
    /**
     * Se inicializan las acciones utilizadas en los botones de la pantalla 
     */
	private void initActions(){
    	cancelA = new AbstractAction("Cancelar") {

            public void actionPerformed(ActionEvent e) {
            	SwingUtilities.windowForComponent(UbicacionesTablePanel.this).dispose();
            }
        };
        
        selectA = new AbstractAction("Reservar") {

            public void actionPerformed(ActionEvent e) {
            	int selection = table.getSelectedRow();
                ICalendarioReserva calendarioReserva = tableModel.getUbicacionAtRow(selection);
                if(calendarioReserva == null) { 
                	notificarError("Por favor seleccione una cancha");
                }else {
                	boolean reservaCancha = controller.reservarCancha(dni, calendarioReserva.getFecha(), calendarioReserva.getHora(), (double)0);
                	if(!reservaCancha){
                		String s;
                		do {
                			s = (String)JOptionPane.showInputDialog(
                                null,
                                "Por favor ingrese una seña",
                                "Seña",
                                JOptionPane.ERROR_MESSAGE);
                		} while(!validValue(s));
                		
                		controller.reservarCancha(dni, calendarioReserva.getFecha(), calendarioReserva.getHora(), (double)Integer.parseInt(s));
                	}
                	Contexto.displayFeedbackMessage(UbicacionesTablePanel.this, "La reserva fue realizada con exito");
                    SwingUtilities.windowForComponent(UbicacionesTablePanel.this).dispose();
                }
                
            }
        };
    }
	
	private boolean validValue(String s) {
		boolean result = true;
		int value = -1;
		try {
			value = Integer.parseInt(s);
		}catch(NumberFormatException e) {
			result = false;
		}
		
		if(value <= 0) {
			result = false;
		}
		
		if(!result){
			Contexto.displayErrorMessage(this, "El valor debe ser numerico y mayor a cero");
		}
		
		return result;
	}
	
	public void showPanel() {
    	JFrame ubicacionesFrame = new JFrame();
        ubicacionesFrame.setTitle("Mejores Espacios");
        ubicacionesFrame.getContentPane().add(this);
        ubicacionesFrame.setPreferredSize(new Dimension(700,240));
        ubicacionesFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        ubicacionesFrame.pack();
        ubicacionesFrame.setLocationRelativeTo(null);
        ubicacionesFrame.setVisible(true);
    }

	@Override
	public void notificarError(String error) {
		Contexto.displayErrorMessage(this, error);
	}
}



















